﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web.Security;
using System.Security.Permissions;

namespace WSSaiGon
{
    /// <summary>
    /// Summary description for WSNXBSaiGon
    /// </summary>
    [WebService(Namespace = "http:/nxbsaigon.somee.com/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class WSNXBSaiGon : System.Web.Services.WebService
    {
        // Tạo kết nối toàn cục để sử dụng cho WS
        private static SqlConnection conn = new SqlConnection(ConfigurationManager
                                                    .ConnectionStrings["SachConnectionString"]
                                                    .ConnectionString);

        /*************************************************************************************************************************/
        // Mô tả  : WS tìm kiếm sách theo tên sách
        // Tác giả  : Ông Xuân Hồng
        // Email  : ongxuanhong@gmail.com
        // Ngày cập nhật : 30/10/2011 

        // Tên hàm  : TimKiemSach 
        // Mô tả  : Người dùng nhập vào tên sách để tìm kiếm sách trong kho
        // Kiểu tra về  : DataSet 
        // Tham số: string tenSach - tên sách mà người dùng nhập vào
        [WebMethod(Description = "Dịch vụ cho phép người dùng tìm kiếm sách theo tên sách", CacheDuration = 60, EnableSession = true)]
        public DataSet TimKiemSach(string tenSach)
        {
                SqlDataAdapter adapter = new SqlDataAdapter("SELECT [TenSach], [MoTa], [DonGia] FROM [Sach]" +
                                                            "WHERE TenSach LIKE '%" + tenSach + "%'", conn);
                DataSet ds = new DataSet();
                adapter.Fill(ds, "Sach");
                return ds;
        }

        /*************************************************************************************************************************/
        // Mô tả  : WS kiểm tra số lượng của 1 sách
        // Tác giả  : Tang Pham Tung Long   
        // Ngày cập nhật : 11/9/2011 

        // Tên hàm  : QueryInventoryAmount
        // Mô tả  : Kiểm tra số lượng còn tồn lại trong kho của một sách
        // Kiểu tra về  : int 
        // Tham số: int ProductID - Mã của sách cần kiểm tra
        [WebMethod(Description = "Dịch vụ cho phép người dùng kiểm tra số lượng tồn kho của một sách", CacheDuration = 60, EnableSession = true)]
        public int QueryInventoryAmount(int ProductID)
        {
            if (Session["username"] != null)
            {
                return KiemTraSoLuongSach(ProductID);
            }
            else
                return -1;
        }




        /*************************************************************************************************************************/
        // Mô tả  : WS Lấy ngày cập nhập gần nhất của 1 sách có trong kho
        // Tác giả  : Tang Pham Tung Long   
        // Ngày cập nhật : 11/9/2011 

        // Tên hàm  : InventoryLastUpdate
        // Mô tả  : Xem ngày cập nhật gần nhất của một sách
        // Kiểu tra về  : DateTime 
        // Tham số: int ProductID - Mã của sách cần xem
        [WebMethod(Description = "Dịch vụ cho phép người dùng xem ngày cập nhập gần nhất của một sách", CacheDuration = 60, EnableSession = true)]
        public DateTime InventoryLastUpdate(int ProductID)
        {
            if (Session["username"] != null)
            {
                return XemNgayNhapKhoGanNhat(ProductID);
            }
            else
                return new DateTime(1900,1,1);
        }


        /*************************************************************************************************************************/
        // Mô tả  : WS cập nhập sách 
        // Tác giả  : Tang Pham Tung Long   
        // Ngày cập nhật : 11/9/2011 

        // Tên hàm  : InventoryUpdate
        // Mô tả  : cập nhập lại số lượng và đơn giá của một sách
        // Kiểu tra về  : int 
        // Tham số: int ProductID - mã của sách
        // Tham số: int TotalAmount - số lượng sách cần cập nhật 
        // Tham số: float PricePerUnit - đơn giá mới cần cập nhật
        [WebMethod(Description = "Dịch vụ cho phép người dùng cập nhật số lượng và đơn giá mới của một s", CacheDuration = 60, EnableSession = true)]
        public int InventoryUpdate(int ProductID, int TotalAmount, float PricePerUnit)
        {
            if (Session["username"] != null)
            {
                return CapNhapSach(ProductID, TotalAmount, PricePerUnit);
            }
            return -1;
        }


        
        /*************************************************************************************************************************/
        // Mô tả  : WS kiểm tra điều kiện được vận chuyển sách hay không
        // Tác giả  : Tang Pham Tung Long   
        // Ngày cập nhật : 11/9/2011 

        // Tên hàm  : InventoryStatus
        // Mô tả  : kiểm tra số lượng sách trong kho có đủ để vận chuyển hay không
        // Kiểu tra về  : string 
        // Tham số: int ProductID - mã của sách
        // Tham số: int TotalAmount - số lượng sách cần vận chuyển
        [WebMethod(Description = "Dịch vụ cho phép người dùng kiểm tra xem một sách có đủ số lượng để vận chuyển không", CacheDuration = 60, EnableSession = true)]
        public string InventoryStatus(int ProductID, int TotalAmount)
        {
            if (Session["username"] != null)
            {
                if (KiemTraTonKho(ProductID, TotalAmount))
                    return "AllowTrans";
                else
                    return "StopTrans";
            }
            else
                return "-1";
        }



        /*************************************************************************************************************************/
        // Mô tả  : WS đăng nhập
        // Tác giả  : Tang Pham Tung Long   
        // Ngày cập nhật : 11/9/2011 

        // Tên hàm  : WSLogin
        // Mô tả  : kiểm tra tài khoản đăng nhập nếu hợp lệ thì sau đó se cấp cho người dùng 1 SID
        // Kiểu tra về  : int 
        // Tham số: string BankUserName - tên đăng nhập của ng` dùng
        // Tham số: string Pwd - mật khẩu đăng nhập của ng` dùng
        [WebMethod(Description = "Dịch vụ cho phép người dùng đăng nhập vào WS", CacheDuration = 60, EnableSession = true)]
        public int WSLogin(string BankUserName, string Pwd)
        {
            if (KiemTraDangNhap(BankUserName, Pwd))
            {
                Session["username"] = BankUserName;
                Session.Timeout = 5;
                return 1;
            }
            else
                return 0;
        }


        /*************************************************************************************************************************/
        // Mô tả  : WS kiểm tra đã đăng nhập hay chưa nếu chưa thì trả về false, rồi thì trả vể true
        [WebMethod(Description = "Dịch vụ cho phép người dùng kiểm tra đã đăng nhập vào ws chưa", CacheDuration = 60, EnableSession = true)]
        public bool IsAuthenticated()
        {
            if (Session["username"] != null)
                return true;
            else
                return false;
        }


        /*************************************************************************************************************************/
        // Mô tả  : WS đăng xuất
        [WebMethod(Description = "Dịch vụ cho phép người dùng đăng xuất tài khoản", CacheDuration = 60, EnableSession = true)]
        public void LogOut()
        {
            Session["username"] = null;
        }



        /*************************************************************************************************************************/
        private bool KiemTraDangNhap(string username, string password)
        {
            // mở kết nối để thực thi lệnh truy vấn
            conn.Open(); 
            SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM DoiTac " +
                                            "WHERE Username='" + username + "' AND Password='" + password + "'", conn);
            int count = (int)cmd.ExecuteScalar();
            conn.Close();
            if (count != 0)
                return true;
            else
                return false;
        }

        private bool KiemTraTonKho(int MaSach, int SoLuong)
        {
            // mở kết nối để thực thi lệnh truy vấn
            conn.Open(); 

            // nếu số lượng trong kho sau khi đặt mua vẫn lớn hơn 10 thì cho phép đặt mua
            SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM Sach " +
                                            "WHERE MaSach=" + MaSach + " AND SoLuong - " + SoLuong + " > 10", conn);
            int count = (int)cmd.ExecuteScalar();
            conn.Close();
            if (count != 0)
                return true;
            else
                return false;
        }

        //kiểm tra số lượng của sách có mã là MaSach
        private int KiemTraSoLuongSach(int MaSach)
        {
            int count = 0;
            //câu truy vấn tìm số lượng của sách có mã là MaSach
            string str = "SELECT [SoLuong] FROM [Sach]" +
                                            "WHERE [MaSach] = '" + MaSach + "'";

            using (conn)
            {
                //ket noi co so du lieu
                SqlCommand cmd = new SqlCommand(str, conn);
                try
                {
                    //mo ket noi và thực thi câu truy vấn
                    conn.Open();
                    count = (int)cmd.ExecuteScalar();
                    conn.Close();
                }
                catch (Exception ex)
                {
                }
            }

            return (int)count;
        }

        //xem ngày nhập kho gần nhất của 1 sách 
        private DateTime XemNgayNhapKhoGanNhat(int MaSach)
        {

            DateTime date = new DateTime(1900, 1, 1);                               //tao biến date kiểu DateTime (Năm, Tháng, Ngày)

            string str = "SELECT [NgayNhapKho] FROM [Sach]" +
                                            "WHERE [MaSach] = '" + MaSach + "'";    //câu truy vấn lấy ngày nhập kho của sách có mã là MaSach

            using (conn)
            {
                //ket noi co so du lieu
                SqlCommand cmd = new SqlCommand(str, conn);
                try
                {
                    //mo ket noi và thực thi câu truy vấn
                    conn.Open();
                    date = (DateTime)cmd.ExecuteScalar();
                    conn.Close();
                }
                catch (Exception ex)
                {
                }
            }

            return date;
        }

        //cap nhap so luong, don gia cua sach
        private int CapNhapSach(int MaSach, int SoLuong, float DonGia)
        {
            string str = "UPDATE [Sach] SET [SoLuong] = " + SoLuong + ", [DonGia] =" + DonGia + " WHERE [MaSach] =" + MaSach;
            int count = 0;

            using (conn)
            {

                //ket noi co so du lieu
                SqlCommand cmd = new SqlCommand(str, conn);
                try
                {
                    //mo ket noi và thực thi câu truy vấn
                    conn.Open();
                    count = cmd.ExecuteNonQuery();
                    conn.Close();
                }
                catch (Exception ex)
                {
                }
            }
            if (count > 0)
                return 1;
            else
                return 0;
        }
    }
}
